﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassFolio.Model;
using System.Security;
using System.Data.OracleClient;
using System.Data;
using ClassFolio;


namespace OraFolio
{
    /// <summary>
    /// Реализация доступа к базе данных Oracle
    /// </summary>
    public sealed class OraDB
    {
        /// <summary>
        /// Проверка соединения с базой данных
        /// </summary>
        public static void CheckConnection()
        {
            if (OraDB.State == ConnectionState.Closed || OraDB.State == ConnectionState.Closed)
                throw new EFolioSource(0, MessageType.AllertLog, Messages.db_close_connection, null);
        }

        /// <summary>
        /// Коннекция к базе данных. Метод статический и поэтому после одной удачной коннекции нужно использовать
        /// статическое же свойство класса Connection. Повторный вызов метода Connect, закроет текущее соединение
        /// и будет предпринята попытка открыть новое.
        /// </summary>
        /// <param name="login">Идентификатор пользователя</param>
        /// <param name="password">Пользовательский пароль</param>
        /// <param name="source">Идентификатор базы</param>
        /// <returns>Если коннекция происходит успешно, возвращается true, иначе false</returns>
        public static bool Connect(string login, string password, string source)
        {
            CloseConnection();

            OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder();
            builder["Data Source"] = source;
            builder["Unicode"] = true;
            builder["User ID"] = login;
            builder["Password"] = password;

            _connection.ConnectionString = builder.ToString();
            try
            {
                _connection.Open();
                return true;
            }
            catch 
            {
                // Уходит на уровень клиента
                throw;
            }
        }

        /// <summary>
        /// Начало транзакции
        /// </summary>
        public static void StartTransaction()
        {
            CheckConnection();
            _transaction = _connection.BeginTransaction();
        }

        /// <summary>
        /// Отмена транзакции
        /// </summary>
        public static void Rollback()
        {
           _transaction.Rollback();
        }

        /// <summary>
        /// Подтверждение транзакции
        /// </summary>
        public static void Commit()
        {
           _transaction.Commit();
        }

        /// <summary>
        /// Закрытие текущего соединения с базой данных
        /// </summary>
        // Закрытие текущего соединения с базой данных
        public static void CloseConnection()
        {
            _connection.Close();
        }

        // Properties
        /// <summary>
        /// 
        /// </summary>
        public static OracleConnection Connection { get { return _connection; } }
        public static OracleTransaction Transaction { get { return _transaction; } }
        public static ConnectionState State { get { return _connection.State; } }
        
        // private
        private static OracleConnection _connection = new OracleConnection();
        private static OracleTransaction _transaction;
    }
}
